# 文本转语音工具配置文件
"""
性能优化配置参数
将硬编码的配置参数外置，便于调整和维护
"""

# 线程池配置
THREAD_CONFIG = {
    # 标准模式配置
    'standard': {
        'max_workers': 16,
        'min_workers': 2,
        'cpu_multiplier': 2,
        'task_cache_size': 100
    },
    
    # 激进优化模式配置（用于大文本处理）
    'aggressive': {
        'max_workers': 64,  # 支持64个工作线程
        'min_workers': 8,   # 最小8个线程保证基础性能
        'cpu_multiplier': 8, # CPU核心数的8倍
        'task_cache_size': 500, # 更大的任务缓存
        'dynamic_scaling': True, # 启用动态扩缩容
        'numa_optimization': True # NUMA优化
    },
    
    # 向后兼容的默认值
    'max_workers': 16,
    'min_workers': 2,
    'cpu_multiplier': 2,
    'task_cache_size': 100
}

# 文本分段配置
TEXT_SEGMENTATION = {
    # 标准模式分段策略
    'standard': {
        'short_text_threshold': 500,
        'medium_text_threshold': 3000,
        'short_max_length': 1000,
        'short_min_length': 500,
        'medium_max_length': 800,
        'medium_min_length': 200,
        'long_max_length': 600,
        'long_min_length': 150,
        'chunk_size': 64 * 1024
    },
    
    # 激进优化模式分段策略（大文本专用）
    'aggressive': {
        'short_text_threshold': 2000,      # 提高短文本阈值
        'medium_text_threshold': 10000,    # 提高中等文本阈值
        'large_text_threshold': 100000,    # 新增大文本阈值（10万字）
        'mega_text_threshold': 300000,     # 超大文本阈值（30万字）
        
        # 短文本分段参数
        'short_max_length': 1500,
        'short_min_length': 800,
        
        # 中等文本分段参数  
        'medium_max_length': 1800,
        'medium_min_length': 1000,
        
        # 大文本分段参数（10-30万字）
        'large_max_length': 2000,
        'large_min_length': 1200,
        
        # 超大文本分段参数（30万字以上）
        'mega_max_length': 2500,
        'mega_min_length': 1500,
        
        # 流式处理块大小
        'chunk_size': 256 * 1024,  # 256KB，更大的块
        'parallel_preprocessing': True,  # 启用并行预处理
        'smart_merge': True  # 智能合并相邻短段落
    },
    
    # 向后兼容的默认值
    'short_text_threshold': 500,
    'medium_text_threshold': 3000,
    'short_max_length': 1000,
    'short_min_length': 500,
    'medium_max_length': 800,
    'medium_min_length': 200,
    'long_max_length': 600,
    'long_min_length': 150,
    'chunk_size': 64 * 1024
}

# 异步处理配置
ASYNC_CONFIG = {
    # 标准模式配置
    'standard': {
        'total_timeout': 180,
        'connect_timeout': 30,
        'connection_limit': 5,
        'connection_limit_per_host': 3,
        'cleanup_wait': 0.05
    },
    
    # 激进优化模式配置（高并发网络）
    'aggressive': {
        'total_timeout': 300,  # 5分钟总超时，给大文本更多时间
        'connect_timeout': 15,  # 减少连接超时，快速失败重试
        'connection_limit': 30,  # 30个总连接数
        'connection_limit_per_host': 15,  # 每主机15个连接
        'cleanup_wait': 0.01,  # 减少清理等待时间
        'keepalive_timeout': 30,  # 连接保活30秒
        'connection_pool_size': 50,  # 连接池大小
        'enable_http2': True,  # 启用HTTP/2（如果支持）
        'connection_prewarming': True,  # 连接预热
        'batch_size': 10  # 批量处理大小
    },
    
    # 向后兼容的默认值
    'total_timeout': 180,
    'connect_timeout': 30,
    'connection_limit': 5,
    'connection_limit_per_host': 3,
    'cleanup_wait': 0.05
}

# UI更新频率配置
UI_CONFIG = {
    # 性能统计更新频率（秒）
    'perf_update_interval': 1.0,
    
    # 系统监控更新频率（毫秒）
    'system_monitor_interval': 3000,
    
    # 网络检测频率（毫秒）
    'network_check_interval': 15000,
    
    # 性能历史记录数量
    'performance_history_size': 3
}

# 内存管理配置
MEMORY_CONFIG = {
    # 标准模式配置
    'standard': {
        'use_bulk_cleanup': True,
        'audio_merge_chunk_size': 64 * 1024,
        'cleanup_delay': 0.1
    },
    
    # 激进优化模式配置（大内存缓存）
    'aggressive': {
        'use_bulk_cleanup': True,
        'audio_merge_chunk_size': 1024 * 1024,  # 1MB块大小
        'cleanup_delay': 0.01,  # 更快的清理
        'memory_cache_size': 2 * 1024 * 1024 * 1024,  # 2GB内存缓存
        'enable_memory_mapping': True,  # 启用内存映射
        'zero_copy_merge': True,  # 零拷贝合并
        'prealloc_temp_files': 100,  # 预分配100个临时文件
        'in_memory_threshold': 5 * 1024 * 1024,  # 5MB以下在内存处理
        'gc_optimization': True  # 垃圾回收优化
    },
    
    # 向后兼容的默认值
    'use_bulk_cleanup': True,
    'audio_merge_chunk_size': 64 * 1024,
    'cleanup_delay': 0.1
}

# 错误处理配置
ERROR_CONFIG = {
    # 最大重试次数
    'max_retries': 3,
    
    # 重试间隔（秒）
    'retry_interval': 1.0,
    
    # 错误信息简化（减少日志输出）
    'simplified_logging': True
}

# 性能模式配置
PERFORMANCE_MODES = {
    'standard': '标准模式 - 平衡性能和资源占用',
    'aggressive': '激进模式 - 最大化性能，适用于大文本处理',
    'mega': '超级模式 - 30万字以上超大文本专用，极致性能优化'
}

# 全局性能模式设置（默认为标准模式）
_current_performance_mode = 'standard'

# 超大文本优化配置（30万字以上专用）
MEGA_TEXT_CONFIG = {
    # 超大文本阈值（字符数）
    'threshold': 300000,
    
    # 超级分段策略
    'segmentation': {
        'max_length': 2500,  # 2500字符/段
        'min_length': 1500,  # 最小1500字符
        'target_segments': 120,  # 目标120个段落
        'smart_merge_threshold': 800,  # 小于800字符的段落合并
        'parallel_preprocessing': True
    },
    
    # 极致网络配置（降低并发避免服务器拒绝）
    'network': {
        'total_connections': 12,  # 降低到12个总连接
        'connections_per_host': 6,  # 每主机6个连接
        'connection_prewarming': True,  # 连接预热
        'batch_size': 5,  # 批量处理5个任务
        'keepalive_timeout': 60,  # 连接保活60秒
        'enable_http2': True,
        'request_pipelining': False,  # 禁用管道化避免冲突
        'retry_attempts': 3,  # 重试3次
        'retry_delay': 2.0,  # 重试延迟2秒
        'rate_limit_delay': 0.5  # 请求间隔0.5秒
    },
    
    # 超级并发配置
    'concurrency': {
        'max_workers': 64,  # 最大64个工作线程
        'min_workers': 16,  # 最小16个线程
        'dynamic_scaling': True,  # 动态扩缩容
        'numa_aware': True,  # NUMA感知调度
        'task_stealing': True,  # 任务窃取
        'priority_queue_size': 1000
    },
    
    # 内存优化配置
    'memory': {
        'cache_size': 3 * 1024 * 1024 * 1024,  # 3GB内存缓存
        'in_memory_threshold': 10 * 1024 * 1024,  # 10MB以下内存处理
        'zero_copy_merge': True,  # 零拷贝合并
        'memory_mapping': True,  # 内存映射
        'prealloc_temp_files': 200,  # 预分配200个临时文件
        'gc_threshold': 0.8  # GC触发阈值
    },
    
    # 流式合并配置
    'streaming': {
        'enable_streaming_merge': True,  # 启用流式合并
        'merge_chunk_size': 2 * 1024 * 1024,  # 2MB合并块
        'async_io': True,  # 异步I/O
        'buffer_size': 64 * 1024 * 1024,  # 64MB缓冲区
        'concurrent_mergers': 4  # 4个并发合并器
    }
}

def set_performance_mode(mode: str):
    """
    设置性能模式
    
    Args:
        mode: 'standard' 或 'aggressive'
    """
    global _current_performance_mode
    if mode in PERFORMANCE_MODES:
        _current_performance_mode = mode
        print(f"✅ 性能模式已切换到: {PERFORMANCE_MODES[mode]}")
    else:
        print(f"❌ 无效的性能模式: {mode}")

def get_current_performance_mode():
    """获取当前性能模式"""
    return _current_performance_mode

def get_config(section: str, key: str = None, default=None, mode: str = None):
    """
    获取配置参数（支持性能模式）
    
    Args:
        section: 配置区段名
        key: 配置键名，如果为None则返回整个区段
        default: 默认值
        mode: 性能模式，如果为None则使用当前全局模式
    
    Returns:
        配置值或默认值
    """
    if mode is None:
        mode = _current_performance_mode
    
    sections = {
        'thread': THREAD_CONFIG,
        'text': TEXT_SEGMENTATION,
        'async': ASYNC_CONFIG,
        'ui': UI_CONFIG,
        'memory': MEMORY_CONFIG,
        'error': ERROR_CONFIG
    }
    
    section_config = sections.get(section)
    if section_config is None:
        return default
    
    # 如果配置支持模式选择，优先使用指定模式的配置
    if isinstance(section_config, dict) and mode in section_config:
        mode_config = section_config[mode]
        if key is None:
            return mode_config
        return mode_config.get(key, section_config.get(key, default))
    
    # 回退到标准配置
    if key is None:
        return section_config
    
    return section_config.get(key, default)

def auto_detect_performance_mode(text_length: int):
    """
    根据文本长度自动检测并设置性能模式
    
    Args:
        text_length: 文本长度（字符数）
    """
    if text_length >= MEGA_TEXT_CONFIG['threshold']:  # 30万字符以上使用超级模式
        set_performance_mode('mega')
        return 'mega'
    elif text_length >= 100000:  # 10万字符以上使用激进模式
        set_performance_mode('aggressive')
        return 'aggressive'
    else:
        set_performance_mode('standard')
        return 'standard'

def get_mega_text_config(section: str = None):
    """
    获取超大文本优化配置
    
    Args:
        section: 配置区段名，如果为None则返回全部配置
    
    Returns:
        配置字典或指定区段的配置
    """
    if section is None:
        return MEGA_TEXT_CONFIG
    return MEGA_TEXT_CONFIG.get(section, {})

def is_mega_text(text_length: int) -> bool:
    """
    判断是否为超大文本
    
    Args:
        text_length: 文本长度（字符数）
    
    Returns:
        bool: 是否为超大文本
    """
    return text_length >= MEGA_TEXT_CONFIG['threshold']
